SET in SQL
contents
SET은 SQL에서 가장 다재다능한 키워드 중 하나입니다. 기본적으로 "할당 연산자(Assignment Operator)" 역할을 한다고 생각하면 되지만, 어디에 사용하느냐에 따라 그 역할이 크게 세 가지로 나뉩니다.
1. UPDATE 문 (데이터 수정)
가장 흔하게 사용되는 경우입니다. UPDATE 문에서 SET 절은 어떤 컬럼을 어떤 새로운 값으로 변경할지 지정합니다.
A. 기본 할당
하나 또는 여러 컬럼에 정적인 값을 할당합니다. 여러 컬럼을 변경할 때는 쉼표(,)로 구분합니다.
UPDATE Employees
SET department = 'Marketing', status = 'Active'
WHERE id = 101;
B. 수식 활용
SET 절 안에서 해당 행(Row)의 기존 데이터를 참조하여 새로운 값을 계산할 수 있습니다.
-- IT 부서 직원들의 연봉을 10% 인상
UPDATE Employees
SET salary = salary * 1.10
WHERE department = 'IT';
C. 서브쿼리 활용 (고급)
SET 절 내부에 SELECT 쿼리를 사용하여 전혀 다른 테이블에서 값을 가져와 업데이트할 수 있습니다.
-- 부서의 총 수익을 계산하여 직원의 보너스를 업데이트
UPDATE Employees
SET bonus = (SELECT revenue * 0.05 FROM Departments WHERE id = Employees.dept_id)
WHERE status = 'Active';
2. 변수 할당 (절차적 SQL)
스크립트, 스토어드 프로시저, 함수 등을 작성할 때 임시 메모리에 데이터를 저장해야 하는 경우가 많습니다. 이때 SET을 사용하여 변수에 값을 할당합니다.
A. SQL Server (T-SQL)
SQL Server에서는 먼저 변수를 선언(DECLARE)한 다음, SET을 사용해 값을 넣어야 합니다.
DECLARE @TargetDate DATE;
SET @TargetDate = '2024-12-31';
SELECT * FROM Orders WHERE order_date = @TargetDate;
B. MySQL
MySQL에서는 @ 기호와 SET 명령어를 사용하여 즉석에서 사용자 정의 세션 변수를 만들고 값을 넣을 수 있습니다.
SET @total_sales = 0;
SELECT SUM(amount) INTO @total_sales FROM Orders;
-- 할당된 변수 사용
SELECT @total_sales;
3. 시스템 및 세션 환경 설정 (관리자 도구)
데이터베이스에는 시간대(Timezone), 메모리 제한, 문법 엄격도 등 수백 가지의 내부 설정이 있습니다. SET 명령어를 사용하면 작동 중에 이러한 설정을 동적으로 변경할 수 있습니다.
A. 세션 레벨 (현재 접속자에게만 적용)
현재 연결된 데이터베이스 세션에만 영향을 미칩니다. 접속을 끊으면 기본값으로 돌아갑니다.
-- MySQL: 현재 세션의 시간대를 한국 시간으로 변경
SET time_zone = '+09:00';
-- PostgreSQL: 스키마 검색 경로를 임시로 변경
SET search_path TO my_custom_schema, public;
B. 글로벌 레벨 (서버 전체에 적용)
데이터베이스 서버 전체의 동작 방식을 변경합니다. (관리자 권한이 필요합니다).
-- MySQL: 서버 전체의 최대 동시 접속자 수를 2000으로 증가
SET GLOBAL max_connections = 2000;
4. 용어 혼동 주의: "SET 절" vs "집합 연산자(Set Operators)"
초보자들이 SET 절(Clause)과 집합 연산자(Set Theory Operators) 를 혼동하는 경우가 매우 많습니다.
SET절: 지금까지 설명한 값을 할당하는 키워드입니다 (UPDATE table SET...).- 집합 연산자 (Set Operators): 두 개의 서로 다른
SELECT쿼리 결과를 세로로 결합하거나 비교하는 키워드들입니다. (수학의 집합 개념)UNION(두 쿼리 합치기, 중복 제거).UNION ALL(두 쿼리 합치기, 중복 포함).INTERSECT(교집합: 두 쿼리에 모두 있는 행만 반환).EXCEPT / MINUS(차집합: 첫 번째 쿼리에만 있는 행 반환).
references